package org.pearl.springboot.minio.spring;

import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.config.Scope;

/**
 * Created by TD on 2021/9/29
 */
public class ThreadScope implements Scope {


    ThreadLocal<Object> threadLocal = new ThreadLocal<>();

    /**
     * 从作用域返回具有给定名称的对象
     *
     * @param name          要检索的对象的名称
     * @param objectFactory 用于创建作用域的对象工厂
     * @return 返回所需对象
     */
    @Override
    public Object get(String name, ObjectFactory<?> objectFactory) {
        // 1. 从当前线程获取Bean对象
        Object obj = threadLocal.get();
        if (obj == null) {
            // 2. 当前线程不存在该Bean，则创建并设置到线程中
            Object object = objectFactory.getObject();
            threadLocal.set(object);
            return object;
        } else {
            // 3. 当前线程已存在，直接返回
            return obj;
        }
    }

    /**
     * 从作用域中删除具有给定{@code name}的对象
     */
    @Override
    public Object remove(String name) {
        return null;
    }

    /**
     * 注册一个回调，在销毁指定的对象
     *
     * @param name     要为其执行回调销毁的对象名称
     * @param callback 要执行的销毁回调
     */
    @Override
    public void registerDestructionCallback(String name, Runnable callback) {

    }

    /**
     * 解析给定键的上下文对象（如果有）
     */
    @Override
    public Object resolveContextualObject(String key) {
        return null;
    }

    /**
     * 返回当前作用域的会话ID（如果有）
     */
    @Override
    public String getConversationId() {
        return null;
    }
}
